<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:m="http://www.w3.org/1998/Math/MathML"
        version="2.0">

    <xsl:output method="text" encoding="UTF-8"/>

    <!-- 根元素 math -->
    <xsl:template match="/m:math">
        <xsl:apply-templates/>
    </xsl:template>

    <!-- 数字 -->
    <xsl:template match="m:mn">
        <xsl:value-of select="."/>
    </xsl:template>

    <!-- 变量/标识符 -->
    <xsl:template match="m:mi">
        <xsl:value-of select="."/>
    </xsl:template>

    <!-- 运算符 -->
    <xsl:template match="m:mo">
        <xsl:choose>
            <xsl:when test=". = '±'">\pm</xsl:when>
            <xsl:when test=". = '×'">\times</xsl:when>
            <xsl:when test=". = '÷'">\div</xsl:when>
            <xsl:when test=". = '≤'">\le</xsl:when>
            <xsl:when test=". = '≥'">\ge</xsl:when>
            <xsl:when test=". = '≠'">\neq</xsl:when>
            <xsl:when test=". = '∈'">\in</xsl:when>
            <xsl:when test=". = '∉'">\notin</xsl:when>
            <xsl:when test=". = '∑'">\sum</xsl:when>
            <xsl:when test=". = '∏'">\prod</xsl:when>
            <xsl:when test=". = '∫'">\int</xsl:when>
            <xsl:when test=". = '∞'">\infty</xsl:when>
            <xsl:when test=". = '∂'">\partial</xsl:when>
            <xsl:when test=". = '∇'">\nabla</xsl:when>
            <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- 分组 mrow -->
    <xsl:template match="m:mrow">
        <xsl:apply-templates/>
    </xsl:template>

    <!-- 分数 -->
    <xsl:template match="m:mfrac">
        <xsl:text>\frac{</xsl:text>
        <xsl:apply-templates select="*[1]"/>
        <xsl:text>}{</xsl:text>
        <xsl:apply-templates select="*[2]"/>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <!-- 上标 -->
    <xsl:template match="m:msup">
        <xsl:apply-templates select="*[1]"/>
        <xsl:text>^{</xsl:text>
        <xsl:apply-templates select="*[2]"/>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <!-- 下标 -->
    <xsl:template match="m:msub">
        <xsl:apply-templates select="*[1]"/>
        <xsl:text>_{</xsl:text>
        <xsl:apply-templates select="*[2]"/>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <!-- 上下标 -->
    <xsl:template match="m:msubsup">
        <xsl:apply-templates select="*[1]"/>
        <xsl:text>_{</xsl:text>
        <xsl:apply-templates select="*[2]"/>
        <xsl:text>}^{</xsl:text>
        <xsl:apply-templates select="*[3]"/>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <!-- 平方根 -->
    <xsl:template match="m:msqrt">
        <xsl:text>\sqrt{</xsl:text>
        <xsl:apply-templates/>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <!-- n次方根 -->
    <xsl:template match="m:mroot">
        <xsl:text>\sqrt[</xsl:text>
        <xsl:apply-templates select="*[2]"/>
        <xsl:text>]{</xsl:text>
        <xsl:apply-templates select="*[1]"/>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <!-- 括号 -->
    <xsl:template match="m:mfenced">
        <xsl:text>(</xsl:text>
        <xsl:apply-templates/>
        <xsl:text>)</xsl:text>
    </xsl:template>

    <!-- 求和 -->
    <xsl:template match="m:msum">
        <xsl:text>\sum</xsl:text>
        <xsl:apply-templates select="m:munder"/>
        <xsl:apply-templates select="m:mover"/>
    </xsl:template>

    <!-- 积分 -->
    <xsl:template match="m:mintegral">
        <xsl:text>\int</xsl:text>
        <xsl:apply-templates select="m:munder"/>
        <xsl:apply-templates select="m:mover"/>
    </xsl:template>

    <!-- 下限 -->
    <xsl:template match="m:munder">
        <xsl:text>_{</xsl:text>
        <xsl:apply-templates/>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <!-- 上限 -->
    <xsl:template match="m:mover">
        <xsl:text>^{</xsl:text>
        <xsl:apply-templates/>
        <xsl:text>}</xsl:text>
    </xsl:template>

    <!-- 矩阵 -->
    <xsl:template match="m:mtable">
        <xsl:text>\begin{matrix}</xsl:text>
        <xsl:for-each select="m:mtr">
            <xsl:apply-templates select="m:mtd"/>
            <xsl:if test="position() != last()">
                <xsl:text>\\</xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:text>\end{matrix}</xsl:text>
    </xsl:template>

    <!-- 矩阵行 -->
    <xsl:template match="m:mtr">
        <xsl:apply-templates select="m:mtd"/>
    </xsl:template>

    <!-- 矩阵单元格 -->
    <xsl:template match="m:mtd">
        <xsl:apply-templates/>
        <xsl:if test="position() != last()">
            <xsl:text>&amp;</xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>